#ifndef __UTILS_KEY_EVENT_H__
#define __UTILS_KEY_EVENT_H__

#include <stdint.h>

typedef enum {
    BTN_PRESS_DOWN = 0,            ///< 按下
    BTN_PRESS_UP,                  ///< 抬起
    BTN_PRESS_CLICK,               ///< 单击
    BTN_PRESS_DOUBLE_CLICK,        ///< 双击
    BTN_PRESS_LONG_CLICK,          ///< 长按
	BTN_PRESS_LONG_CLICK_UP,       ///< 长按抬起
	BTN_PRESS_TOO_LONG,			   ///< 按键长时间按下
	BTN_PRESS_FAULT_CLEAR,		   ///< 异常清楚
}BTN_PRESS_E;

typedef enum {
    BTN_MODE_CLICK = 0,         ///< 按键模式 （单击，双击,长按）
	BTN_MODE_CLICK_CHECK,		///< 按键+检测 (单击，双击，长按，按键粘连)
    BTN_MODE_PRESS,             ///< 按住模式  (按下，抬起)
}BTN_PRESS_MODE_E;

typedef enum {
    BTN_STATE_NONE,         ///< 无状态
    BTN_STATE_DOWN,         ///< 按下状态
    BTN_STATE_UP,           ///< 抬起状态
    BTN_STATE_WAIT,         ///< 状态等待
	BTN_STATE_FAULT,		///< 异常状态
}BTN_MOTCH_STATE_E;

#define HAL_KEY_IS_ERROR_ID         (-1)
#define HAL_KEY_READ_EVENT_NULL     (-2)
#define HAL_KEY_MODE_ERROR          (-3)
#define HAL_KEY_NO_MEMORY           (-4)
#define HAL_KEY_OK                  (0)  

//按键读取函数
typedef uint8_t (*key_read_func)();
//回调函数调用
typedef uint8_t (*key_event_func)(uint8_t id,uint8_t event,uint32_t cnt);

typedef struct key_event_struct {
    struct key_event_struct *next;      ///< list next
    key_read_func read_func;            ///< 读取按键函数
    key_event_func event_cb;            ///< event回调函数

    uint8_t status;                     ///< 状态
    uint8_t mode;                       ///< 按键模式
    uint8_t id;                         ///< 对应的key id

    uint8_t clict_cnt;                  ///< 按键次数
    uint32_t scan_cnt;                  ///< 循环次数
}key_event_t;

/**
 * @brief 注册key event 事件
 * @param [in] mode 注册的 key 模式 
 * @param [in] read_f 读取key方法 
 * @param [in] event_f event 时间函数 
 * @return 返回 注册的KEY ID  <0 : error
 ***/
int8_t register_key_event(int mode,key_read_func read_f,key_event_func event_f);

/**
 * @brief 按键key 处理
 * @param [in] key 按键实例 
 ***/
void key_event_process(key_event_t *key);

/**
 * @brief 按键检测
 ***/
void key_scan_process();

/**
 * @brief 按键list销毁
 **/
void key_list_destory();

#endif //__UTILS_KEY_EVENT_H__
